﻿using System;

namespace Lesson3_二维数组
{
    class Program
    {
        static void Main(string[] args)
        {
            #region 基本概念
            //二维数组是使用两个下标来确定元素的数组
            //两个下标可理解成 行 与 列
            //比如矩阵
            //1 2 3 
            //4 5 6 
            #endregion

            #region 二维数组的申明
            //申明方法与一维数组基本相同

            //方法一：变量类型[,] 二维数组名
            int[,] arr1;     //仅申明，不分配内存空间

            //方法二：变量类型[,] 二维数组名 = new 变量类型[行,列]
            int[,] arr2 = new int[3, 3];

            //方法三：变量类型[,] 二维数组名 = new 变量类型[行,列] {{0行内容1, 0行内容2, 0行内容3, ......}，
            //                                                   {1行内容1, 1行内容2, 1行内容3, ......}，
            //                                                      ......
            //                                                   {n行内容1, n行内容2, n行内容3, ......}}
            int[,] arr3 = new int[3, 3] { { 1, 2, 3 }, 
                                          { 4, 5, 6 }, 
                                          { 7, 8, 9 } };

            //方法四：变量类型[,] 数组名 = new 变量类型[] {{0行内容1, 0行内容2, 0行内容3, ......}，
            //                                                   {1行内容1, 1行内容2, 1行内容3, ......}，
            //                                                      ......
            //                                                   {n行内容1, n行内容2, n行内容3, ......}}
            int[,] arr4 = new int[3, 3] { { 1, 2, 3 },
                                          { 4, 5, 6 },
                                          { 7, 8, 9 } };    //数组长度由内容项数决定  

            //方法五：变量类型[,] 数组名 = {{0行内容1, 0行内容2, 0行内容3, ......}，
            //                                                   {1行内容1, 1行内容2, 1行内容3, ......}，
            //                                                      ......
            //                                                   {n行内容1, n行内容2, n行内容3, ......}}
            int[,] arr5 = { { 1, 2, 3 },
                            { 4, 5, 6 },
                            { 7, 8, 9 }};       //数组长度由内容项数决定  
            #endregion

            #region 二维数组的使用
            int[,] array = new int[,] { { 1, 2, 3 },
                                        { 4, 5, 6 } };
            // 1.二维数组的长度
            //获取二维数组的行数
            Console.WriteLine(array.GetLength(0));
            //获取二维数组列数
            Console.WriteLine(array.GetLength(1));

            // 2.访问二维数组中的元素
            //二维数组名[行,列]
            //行 列 均从0开始计
            Console.WriteLine(array[0, 1]);

            // 3.修改二维数组中的元素
            //同一维数组 直接访问并赋值即可

            // 4.遍历二维数组
            //二维数组的遍历与一维数组有所不同 区别在于二维数组的遍历需要嵌套一层循环
            #region 分割线
            Console.WriteLine("******************");
            #endregion
            for (int i = 0; i < array.GetLength(0); i++)        //遍历行数
            {
                for (int j = 0; j < array.GetLength(1); j++)    //遍历列数
                {
                    Console.Write(array[i, j] + " " );
                }
                Console.WriteLine();    //输出完一整行的所有元素后进行换行
            }

            // 5.修改二维数组的长度        
            //方法同一维数组
            #region 分割线
            Console.WriteLine("******************");
            #endregion
            int[,] array2 = new int[3, 3];
            for (int i = 0;i < array.GetLength(0); i++)
            {
                for(int j = 0;j < array.GetLength(1); j++)
                {
                    array2[i,j] = array[i,j];
                }
            }
            array2[2, 0] = 7;
            array2[2, 1] = 8;
            array2[2, 2] = 9;
            array = array2;
            for (int i = 0; i < array.GetLength(0); i++)
            {
                for(int j = 0;j < array.GetLength(1); j++)
                {
                    Console.Write(array[i,j] + " " );
                }
                Console.WriteLine();
            }

            // 6.查找二维数组中元素
            #region 分割线
            Console.WriteLine("******************");
            #endregion
            Console.WriteLine("请输入要查找的元素");
            try
            {
                int searchTarget = int.Parse(Console.ReadLine());
                for (int i = 0; i < array.GetLength(0); i++)
                {
                    for (int j = 0; j < array.GetLength(1); j++)
                    {
                        if (array[i, j] == searchTarget)
                        {
                            Console.WriteLine("{0}位于该二维数组的第{1}行 第{2}列", searchTarget, i + 1, j + 1);
                        }
                    }
                }
            }
            catch
            {
                Console.WriteLine("请按规范输入");
            }
            #endregion

            //总结：二维数组逻辑与一维数组基本一致 主要用于矩阵
        }
    }
}